fn main() {
    println!("Hello, world!");
    //引用

    //&  允许你引用某些值,而不获取其所有权

    // let mut s1 = String::from("Hello");
    
    // let l = calc_length(&mut s1);


    // println!("s1的值还存在:{};s1的长度是:{}",s1,l);


    //把引用作为函数参数的行为叫做借用,这时候函数不会获取之前变量的所有权


    //可变引用有一个重要限制,在特定作用域,对某一块数据,只能有一个可变引用,下面这个会报错
    // let mut s = String::from("hello");

    // let s1 = &mut s;

    // let s2 = &mut s;

    // println!("s1:{};s2:{}",s1,s2);

    //那么我们可以把几个可变引用放到不同的作用域

    let mut s = String::from("hello");

    let s1 = &mut s;
{
    let s2 = &mut s;
}
    
    //不可以同时拥有可变引用和不可变引用

    //可以同时拥有多个不可变引用

    // println!("s1:{};s2:{}",s1,s2);

}

fn calc_length(s:&mut String)->usize {
    s.push_str(", World");
    s.len()
}
